package game.module.item.dao;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import game.module.item.bean.Item;
import lion.common.BeanTool;

public class ItemCache {

	private static Logger logger = LoggerFactory.getLogger(ItemCache.class);

	static class SingletonHolder {
		static ItemCache instance = new ItemCache();
	}

	public static ItemCache getInstance() {
		return SingletonHolder.instance;
	}

	private Map<Integer, Map<Integer, Item>> itemMapTemplateIdKey = new ConcurrentHashMap<Integer, Map<Integer, Item>>();

	public void loadFromDb(int playerId) {
		if (itemMapTemplateIdKey.get(playerId) != null) {
			return;
		}
		List<Item> items = ItemDao.getInstance().getItemsByPlayerId(playerId);
		// add cache with template id key
		Map<Integer, Item> itemMapTemplateIdKeyOne = new HashMap<Integer, Item>();
		try {
			// BeanTool.addOrUpdate(itemMapTemplateIdKeyOne, items,
			// "templateId");
			for (Item item : items) {
				itemMapTemplateIdKeyOne.put(item.getTemplateId(), item);
			}
			itemMapTemplateIdKey.put(playerId, itemMapTemplateIdKeyOne);
		} catch (Exception e) {
			logger.error("", e);
		}
		// logger.info("player items={}",itemMapTemplateIdKey.get(playerId));
	}

	public Map<Integer, Item> getItemTemplateKey(int playerId) {
		return itemMapTemplateIdKey.get(playerId);
	}

	public Item getItemByPlayerIdAndItemId(int playerId, int itemId) {
		if (!itemMapTemplateIdKey.containsKey(playerId)) {
			return null;
		}
		return getItemTemplateKey(playerId).get(itemId);
	}

	public void addNew(int playerId, Item item) {
		itemMapTemplateIdKey.get(playerId).put(item.getTemplateId(), item);
	}

	public void remove(int playerId) {
		logger.info("remove play packback cache!");
		itemMapTemplateIdKey.remove(playerId);
	}

	public Collection<Item> getItemAll(int playerId) {
		return itemMapTemplateIdKey.get(playerId).values();
	}

	public void removeItem(int heroId, Integer templateId) {
		Map<Integer, Item> templateIdKeyMap = getItemTemplateKey(heroId);
		if (templateIdKeyMap != null) {
			templateIdKeyMap.remove(templateId);
		}
	}

}
